#ifndef PBIRSM_HPP
#define PBIRSM_HPP

#include "ap_int.h"
#include "hls_stream.h"
#include "hr.hpp" // 包含 hr.hpp 以获取 raster_params_packet_fixed 定义

// -----------------------------------------------------------
// 定义 PBIRSM 模块数据打包和解包的常量
// -----------------------------------------------------------
// 实际 raster_params_packet_fixed 结构体的总位宽
const int ACTUAL_RASTER_PARAMS_BITS = 650; 
// DDR AXI Master 的数据位宽
const int AXI_STREAM_WORD_BITS = 64; 
// 一个 raster_params_packet_fixed 需要多少个 AXI WORDS 来存储
const int NUM_AXI_WORDS_PER_PACKET = (ACTUAL_RASTER_PARAMS_BITS + AXI_STREAM_WORD_BITS - 1) / AXI_STREAM_WORD_BITS; // (650 + 64 - 1) / 64 = 11 words
// 用于存储一个 raster_params_packet_fixed 的 ap_uint 的总位宽
// 应该足以容纳 NUM_AXI_WORDS_PER_PACKET 个 AXI_STREAM_WORD_BITS
const int PACKED_RASTER_PARAMS_BITS = NUM_AXI_WORDS_PER_PACKET * AXI_STREAM_WORD_BITS; // 11 * 64 = 704 bits


// -----------------------------------------------------------
// DDR AXI Master 接口使用的 64 位数据类型
// -----------------------------------------------------------
typedef ap_uint<AXI_STREAM_WORD_BITS> ddr_word_t; // 用于从DDR读取参数的 64 位字


// -----------------------------------------------------------
// PBIRSM 模块的主HLS函数声明
// 职责：从DDR读取三角形参数，并流式输出给HR模块
// -----------------------------------------------------------
void parameter_buffer_interface_and_raster_setup(
    // 指向DDR中三角形参数缓冲区的 64 位 AXI Master
    // HLS 会为这个指针生成一个 AXI-Lite 寄存器用于 PS 配置基地址，并使用它驱动 M_AXI 端口
    ddr_word_t* params_buffer_base_addr, 
    hls::stream<raster_params_packet_fixed>& output_raster_params_stream, // 输出到HR模块的三角形参数流
    const ap_uint<16> num_triangles_to_process // 本帧需要处理的三角形数量，由PS写入
);

#endif // PBIRSM_HPP
